using UnityEngine;

public class TGS_EnemyTank_Script : MonoBehaviour
{
    [Header("移动速度")]
    public float moveSpeed = 3f;
    [Header("转向速度")]
    public float turnSpeed = 90f;
    [Header("发射炮弹的时间间隔")]
    public float interval = 3f;
    [Header("炮弹预设体")]
    public GameObject bulletPrefab;
    [Header("炮弹飞行速度")]
    public float bulletSpeed = 50f;

    // 玩家
    private Transform player;
    // 与玩家坦克的距离
    private float distance;
    // 射线碰撞检测器
    private RaycastHit hit;
    // 炮弹发射点
    private Transform firePoint;
    // 计时器
    private float timer;
    // 转向角
    private float angle;

    private void Awake()
    {
        // 找到玩家
        player = GameObject.FindWithTag("Player").transform;
        // 设置炮弹发射点
        firePoint = transform.Find("Top/Gun/FirePoint");
    }

    // private void FixedUpdate()
    // {
    //     // 如果当前坦克卡入地板中，则重置它的位置高度
    //     if (transform.position.y < 0)
    //     {
    //         // transform.position += Vector3.up * 3;
    //     }
    // }

    private void Update()
    {
        timer += Time.deltaTime;
        // 计算与玩家坦克的距离
        distance = Vector3.Distance(transform.position, player.position);
        // 根据与玩家坦克的距离不同， 而做出相应行为
        if (distance < 10)
        {
            // 开炮
            Fire();
        }else if (distance < 20)
        {
            // 向前逼近
            Move();
        }
        else
        {
            // 随机逛街
            Patrol();
        }
    }

    /* 转向玩家 */
    private void RotateToPlayer()
    {
        // 当前与玩家坦克的方向向量
        Vector3 direction = player.position - transform.position;
        // 转向该方向
        RotateTo(direction);
    }

    /* 转向目标方向，参数目标方向的方向向量 */
    private void RotateTo(Vector3 direction)
    {
        // 把方向向量转为四元数
        Quaternion targetQua = Quaternion.LookRotation(direction);
        // Lerp转向
        Rotate(targetQua);
    }

    private void Rotate(Quaternion targetQua)
    {
        transform.rotation = Quaternion.Lerp(transform.rotation, targetQua, Time.deltaTime * turnSpeed);
    }

    private void Patrol()
    {
        // 向前移动
        transform.position += transform.forward * moveSpeed * Time.deltaTime;
        // 3秒转向
        if (timer > interval)
        {
            // 随机角度
            angle = Random.Range(0f, 360f);
            // 计时器归0
            timer = 0;
        }
        Rotate(Quaternion.Euler(Vector3.up * angle));
    }

    private void Move()
    {
        // 转向玩家
        RotateToPlayer();
        // 前方2米内没有友军，向前移动
        if (WithoutFriendWithin(2))
        {
            transform.position += transform.forward * Time.deltaTime * moveSpeed;
        }
    }

    private void Fire()
    {
        // 转向玩家
        RotateToPlayer();
        // 判断前方10米内有没有友军，没有则开炮
        if (WithoutFriendWithin(10))
        {
            // 开炮
            if (timer > interval)
            {
                // 生成炮弹
                GameObject bullet = Instantiate(bulletPrefab, firePoint.position, Quaternion.identity);
                // 赋予炮弹速度
                bullet.GetComponent<Rigidbody>().velocity = transform.forward * bulletSpeed;
                // 在1s后销毁炮弹
                Destroy(bullet, 1);
                // 计时器归0
                timer = 0;
            }
        }
    }

    /* 前方d米内没有友军吗？ */
    private bool WithoutFriendWithin(int distance)
    {
        // 发射物理射线
        if (Physics.Raycast(firePoint.position, transform.forward, out hit, distance))
        {
            if (hit.collider.transform.root.tag == "Enemy")
            {
                return false;
            }
        }
        return true;
    }
}